#功能整合
#https://www.modb.pro/db/89600
import os
from tkinter import Tk, StringVar, Label, Entry, Button, Text, E

from docxtpl import DocxTemplate
import pandas as pd
from docx import Document
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.shared import Inches

#读取excel文件生成dict列表
def excel_to_dict_list(path):
    # 读取Excel文件
    df = pd.read_excel(path)
    head_list=list(df.columns)  # 获取数据的列名称
    list_dic=[]  # 创建一个空列表

    for i in df.values:
        a_line=dict(zip(head_list, i))  # 将每行数据和列名称转换成字典
        list_dic.append(a_line)  # 将字典追加到列表上
    return list_dic


#生成新的一个文件,temp_path为模板文件，word_path为新的文件，dictContext为读取excel的每一行所形成的dict
def temp_word(tmep_path,word_path,dictContext):
    print("开始根据模板word生成word")
    tpl = DocxTemplate(tmep_path)
    tpl.render(dictContext)
    tpl.save(word_path)
    print("模板word生成word成功，文件路径：{} ".format(word_path))


#filepath是指定的word文件路径，dirpath是存放图片目录，img1-4为插入word的图片，注意是文件名称，没有带类型那种
def img_insert_word(filepath,dirpath,img1,img2,img3,img4,new_file_path):
    print("开始向word文件 {} 插入图片".format(filepath))

    #文档对象
    doc=Document(filepath)

    # 添加表格
    # 添加一个2行2列的空表
    tab=doc.add_table(rows=2, cols=2)
    # 获取某单元格对象（从0开始索引）
    cell0=tab.cell(0, 0)
    c_p0=cell0.paragraphs[0]
    # 设置单元格内容居中对齐
    c_p0.paragraph_format.alignment=WD_TABLE_ALIGNMENT.CENTER
    c_run0=c_p0.add_run()

    cell1=tab.cell(0, 1)
    c_p1=cell1.paragraphs[0]
    # 设置单元格内容居中对齐
    c_p1.paragraph_format.alignment=WD_TABLE_ALIGNMENT.CENTER
    c_run1=c_p1.add_run()

    cell2=tab.cell(1, 0)
    c_p2=cell2.paragraphs[0]
    # 设置单元格内容居中对齐
    c_p2.paragraph_format.alignment=WD_TABLE_ALIGNMENT.CENTER
    c_run2=c_p2.add_run()

    cell3=tab.cell(1, 1)
    c_p3=cell3.paragraphs[0]
    # 设置单元格内容居中对齐
    c_p3.paragraph_format.alignment=WD_TABLE_ALIGNMENT.CENTER
    c_run3=c_p3.add_run()

    try:
        try:
            c_run0.add_picture(dirpath+"\\"+img1+".png", width=Inches(2.1), height=Inches(2.6))
        #如果插入失败，说明找不到png格式的，尝试找jpg格式的文件
        except FileExistsError:
            c_run0.add_picture(dirpath+"\\"+img1+".jpg", width=Inches(2.1), height=Inches(2.6))
        c_p0.add_run("图一")

        try:
            c_run1.add_picture(dirpath+"\\"+img2+".png", width=Inches(2.1), height=Inches(2.6))
        #如果插入失败，说明找不到png格式的，尝试找jpg格式的文件
        except FileExistsError:
            c_run1.add_picture(dirpath+"\\"+img2+".jpg", width=Inches(2.1), height=Inches(2.6))
        c_p1.add_run("图二")

        try:
            c_run2.add_picture(dirpath+"\\"+img3+".png", width=Inches(2.1), height=Inches(2.6))
        # 如果插入失败，说明找不到png格式的，尝试找jpg格式的文件
        except FileExistsError:
            c_run2.add_picture(dirpath+"\\"+img3+".jpg", width=Inches(2.1), height=Inches(2.6))
        c_p2.add_run("图三")

        try:
            c_run3.add_picture(dirpath+"\\"+img4+".png", width=Inches(2.1), height=Inches(2.6))
        # 如果插入失败，说明找不到png格式的，尝试找jpg格式的文件
        except FileExistsError:
            c_run3.add_picture(dirpath+"\\"+img4+".jpg", width=Inches(2.1), height=Inches(2.6))
        c_p3.add_run("图四")
    except:
        print("图片少了")

    # 保存doc文档
    doc.save(new_file_path)
    print("向word文件:{} 插入图片成功！！！".format(new_file_path))


#功能整合
def work(excel_file_path,template_file,save_file_first_dir,imgdir):
    print("————————————————开始处理————————————————")

    dict_list = excel_to_dict_list(excel_file_path)
    for dict in dict_list:
        #dict为字典元素
        #取镇街为文件名
        zhenjie = dict['镇街']+'.docx'
        filepath = os.path.join(save_file_first_dir,zhenjie)
        temp_word(template_file,filepath,dict)

        #读取excel的图片名称（不加文件类型的）
        img1=dict['图片1']
        img2=dict['图片2']
        img3=dict['图片3']
        img4=dict['图片4']

        #替换模板后生成的doc文档的基础上再次加工，插入图片
        img_insert_word(filepath,imgdir,img1,img2,img3,img4,filepath)

    print("———————————————————————处理完成————————————————————")


def gui():
    # 第1步，实例化object，建立窗口window
    window=Tk()

    # 第2步，给窗口的可视化起名字
    window.title('new word by blueSky')

    window.geometry('530x150')  # 这里的乘是小x

    # 桌面
    desktop=os.path.join(os.path.expanduser("~"), 'Desktop')

    strvar1=StringVar()
    strvar1.set("data.xlsx")
    strvar2=StringVar()
    strvar2.set("template.docx")
    strvar3=StringVar()
    strvar3.set("docdir")
    strvar4=StringVar()
    strvar4.set("imgdir")

    l1=Label(window, text="excel文件")
    e1=Entry(window, show=None, width=50, textvariable=strvar1)

    l2=Label(window, text="模板文件")
    e2=Entry(window, show=None, width=50, textvariable=strvar2)

    l3=Label(window, text="批量生成word的文件目录")
    e3=Entry(window, show=None, width=50, textvariable=strvar3)

    l4=Label(window, text="存放图片的目录")
    e4=Entry(window, show=None, width=50, textvariable=strvar4)

    def insert_point():  # 在鼠标焦点处插入输入内容

        excel_file_path=e1.get()
        template_file=e2.get()
        save_file_first_dir=e3.get()
        imgdir=e4.get()

        work(excel_file_path,template_file,save_file_first_dir,imgdir)


    # 第6步，创建并放置两个按钮分别触发两种情况
    btn1=Button(window, text='开始', width=10,
                height=2, command=insert_point)

    t=Text(window, height=3)
    l1.grid(row=1, column=1, sticky=E)
    e1.grid(row=1, column=2, sticky=E)

    l2.grid(row=2, column=1, sticky=E)
    e2.grid(row=2, column=2, sticky=E)

    l3.grid(row=3, column=1, sticky=E)
    e3.grid(row=3, column=2, sticky=E)

    l4.grid(row=4, column=1, sticky=E)
    e4.grid(row=4, column=2, sticky=E)
    btn1.grid(row=6, column=1, sticky=E)

    # 第8步，主窗口循环显示
    window.mainloop()

if __name__ == '__main__':
    # excel文件
    # excel_file_path="data.xlsx"
    # # 模板文件
    # template_file="template.docx"
    # # 批量生成word的文件目录
    # save_file_first_dir="docdir"
    # # 存放图片的目录
    # imgdir="imgdir"
    #
    # work(excel_file_path,template_file,save_file_first_dir,imgdir)

    gui()